/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "渲染物体管理.h"

#include "框架/工作区/大纲/ui大纲视图.h"
#include "框架/工作区/3D工作区/ui3D场景视口.h"
#include "框架/工作区/工作区.h"

#include "渲染物体创建销毁.h"


void f_om_添加渲染物体(const std::set<S_物体*>& ob, std::u16string name) {
	new C_om_添加渲染物体(ob, name);
}

void f_om_添加渲染物体(const std::set<S_物体*>& ob) {
	new C_om_添加渲染物体(ob);
}

void f_om_删除渲染物体(const std::set<S_物体*>& ob) {
	new C_om_删除渲染物体(ob);
}

void f_om_销毁所有物体() {
	for (auto& e : f_global_渲染物体()) {
		f_OB_销毁网格物体数据(e.second);
		f_ob_销毁(e.second);
	}

	f_global_渲染物体键值().f_Clear();
	f_global_渲染物体().clear();
}

void f_om_设置拾取物体(const std::set<S_物体*>& obs, bool 多选物体, E_工作区类型 工作区类型) {
	new C_om_拾取物体(obs, 多选物体, 工作区类型);
}

void f_OM_排除拾取物体(const std::set<S_物体*>& obs, E_工作区类型 工作区类型) {
	new C_om_排除拾取物体(obs, 工作区类型);
}

void f_OM_框选物体(E_工作区类型 工作区类型, bool 反选) {
	
}

void f_OM_反选物体(const std::set<S_物体*>& ob, E_工作区类型 工作区类型) {
	new C_om_反选物体(ob, 工作区类型);
}






C_om_添加渲染物体::C_om_添加渲染物体(const std::set<S_物体*>& ob, std::u16string name): C_操作记录(E_编辑操作类型::e_操作类型_添加物体) {
	m_ob = ob;
	for (auto& e : m_ob) {
		e->m_Name = name;
		e->m_扩展属性.resize(1);
	}
	f_重做();
}

C_om_添加渲染物体::C_om_添加渲染物体(const std::set<S_物体*>& ob): C_操作记录(E_编辑操作类型::e_操作类型_添加物体) {
	m_ob = ob;
	f_重做();
}

C_om_添加渲染物体::~C_om_添加渲染物体() {
	
}

uint8 C_om_添加渲染物体::f_重做() {
	m_以拾取物体 = S_框架::g_拾取物体;
	for (auto& e : m_以拾取物体) {
		e->m_选中 = false;
	}

	for (auto& e : m_ob) {
		e->m_Name = f_global_渲染物体键值().f_Gen(e->m_Name);
		f_global_渲染物体()[e->m_Name] = e;
	}

	std::set<S_Object*> items;
	for (auto& e : m_ob) {
		e->m_选中 = true;
		items.insert(e);
	}
	f_大纲视图_添加对象(items);


	S_框架::g_拾取物体 = m_ob;
	f_工作区_联动更新(E_工作区类型::e_3D视口, E_工作区操作类型::e_创建物体);
	DEF_记录日志("添加物体:" + std::to_string(m_ob.size()) );
	return C_操作记录::f_重做();
}

uint8 C_om_添加渲染物体::f_撤销() {
	for (auto& e : m_ob) {
		f_global_渲染物体().erase(e->m_Name);
	}

	std::set<S_Object*> items;
	for (auto& e : m_ob) {
		items.insert(e);
	}
	f_大纲视图_删除对象(items);


	S_框架::g_拾取物体 = m_以拾取物体;

	f_工作区_联动更新(E_工作区类型::e_3D视口, E_工作区操作类型::e_创建物体);
	DEF_记录日志("撤销添加物体:" + std::to_string(m_ob.size()) );
	return C_操作记录::f_撤销();
}



C_om_删除渲染物体::C_om_删除渲染物体(const std::set<S_物体*>& ob) : C_操作记录(E_编辑操作类型::e_操作类型_删除物体) {
	m_删除物体 = ob;
	f_重做();
}

C_om_删除渲染物体::~C_om_删除渲染物体() {
	
}

uint8 C_om_删除渲染物体::f_重做() {
	for (auto& e : m_删除物体) {
		f_global_渲染物体().erase(e->m_Name);
	}

	std::set<S_Object*> items;
	for (auto& e : m_删除物体) {
		items.insert(e);
	}
	f_大纲视图_删除对象(items);


	m_拾取物体 = S_框架::g_拾取物体;
	S_框架::g_拾取物体.clear();

	f_工作区_联动更新(E_工作区类型::e_3D视口, E_工作区操作类型::e_删除物体);
	DEF_记录日志("删除物体:" + std::to_string(m_删除物体.size()) );
	return C_操作记录::f_撤销();
}

uint8 C_om_删除渲染物体::f_撤销() {
	for (auto& e : m_删除物体) {
		f_global_渲染物体()[e->m_Name] = e;
	}

	std::set<S_Object*> items;
	for (auto& e : m_删除物体) {
		items.insert(e);
	}
	f_大纲视图_添加对象(items);


	S_框架::g_拾取物体 = m_拾取物体;

	f_工作区_联动更新(E_工作区类型::e_3D视口, E_工作区操作类型::e_删除物体);
	DEF_记录日志("撤销删除物体:" + std::to_string(m_删除物体.size()) );
	return C_操作记录::f_撤销();
}




C_om_拾取物体::C_om_拾取物体(const std::set<S_物体*>& ob, bool 多选物体, E_工作区类型 工作区类型): C_操作记录(E_编辑操作类型::e_操作类型_拾取物体) {
	m_工作区类型 = 工作区类型;
	m_以拾取物体 = S_框架::g_拾取物体;
	m_新拾取物体 = ob;

	if (多选物体) {
		m_新拾取物体.insert(m_以拾取物体.begin(), m_以拾取物体.end());
	}

	C_om_拾取物体::f_重做();
}

C_om_拾取物体::~C_om_拾取物体() {
	
}

uint8 C_om_拾取物体::f_重做() {
	for (auto& e : m_以拾取物体) {
		e->m_选中 = false;
	}
	for (auto& e : m_新拾取物体) {
		e->m_选中 = true;
	}

	S_框架::g_拾取物体 = m_新拾取物体;
	f_工作区_联动更新(m_工作区类型, E_工作区操作类型::e_拾取物体);
	DEF_记录日志("拾取物体:" + std::to_string(m_新拾取物体.size()) );
	return C_操作记录::f_重做();
}

uint8 C_om_拾取物体::f_撤销() {
	for (auto& e : m_以拾取物体) {
		e->m_选中 = true;
	}
	for (auto& e : m_新拾取物体) {
		e->m_选中 = false;
	}

	S_框架::g_拾取物体 = m_以拾取物体;
	f_工作区_联动更新(m_工作区类型, E_工作区操作类型::e_拾取物体);
	DEF_记录日志("撤销拾取物体:" + std::to_string(m_以拾取物体.size()) );
	return C_操作记录::f_撤销();
}




C_om_排除拾取物体::C_om_排除拾取物体(const std::set<S_物体*>& ob, E_工作区类型 工作区类型): C_操作记录(E_编辑操作类型::e_操作类型_拾取物体) {
	m_排除的物体 = ob;
	m_工作区类型 = 工作区类型;

	f_重做();
}

C_om_排除拾取物体::~C_om_排除拾取物体() {
	
}

uint8 C_om_排除拾取物体::f_重做() {
	for (auto& e : m_排除的物体) {
		e->m_选中 = false;
		S_框架::g_拾取物体.erase(e);
	}

	f_工作区_联动更新(m_工作区类型, E_工作区操作类型::e_拾取物体);
	DEF_记录日志("排除拾取物体:" + std::to_string(m_排除的物体.size()) );
	return C_操作记录::f_重做();
}

uint8 C_om_排除拾取物体::f_撤销() {
	for (auto& e : m_排除的物体) {
		e->m_选中 = true;
		S_框架::g_拾取物体.insert(e);
	}

	f_工作区_联动更新(m_工作区类型, E_工作区操作类型::e_拾取物体);
	DEF_记录日志("撤销排除拾取物体:" + std::to_string(m_排除的物体.size()) );
	return C_操作记录::f_撤销();
}





C_om_反选物体::C_om_反选物体(const std::set<S_物体*>& ob, E_工作区类型 工作区类型): C_操作记录(E_编辑操作类型::e_操作类型_拾取物体) {
	m_当前拾取物体 = ob;
	m_工作区类型 = 工作区类型;
	f_重做();
}

C_om_反选物体::~C_om_反选物体()
{
}

uint8 C_om_反选物体::f_重做() {
	for (auto& e : f_global_渲染物体()) {
		(e.second)->m_选中 = true;
	}

	for (auto& e : m_当前拾取物体) {
		e->m_选中 = false;
	}

	S_框架::g_拾取物体.clear();
	for (auto& e : f_global_渲染物体()) {
		if ((e.second)->m_选中) {
			S_框架::g_拾取物体.insert(e.second);
		}
	}

	f_工作区_联动更新(m_工作区类型, E_工作区操作类型::e_拾取物体);
	DEF_记录日志("反选物体: " + std::to_string(m_当前拾取物体.size()) );
	return C_操作记录::f_重做();
}

uint8 C_om_反选物体::f_撤销() {
	for (auto& e : f_global_渲染物体()) {
		(e.second)->m_选中 = false;
	}

	for (auto& e : m_当前拾取物体) {
		e->m_选中 = true;
	}

	S_框架::g_拾取物体.clear();
	for (auto& e : f_global_渲染物体()) {
		if ((e.second)->m_选中) {
			S_框架::g_拾取物体.insert(e.second);
		}
	}

	f_工作区_联动更新(m_工作区类型, E_工作区操作类型::e_拾取物体);
	DEF_记录日志("反选物体: " + std::to_string(m_当前拾取物体.size()) );
	return C_操作记录::f_撤销();
}

